let cacheD2Data = [];
let cacheD1Item = null;
let cacheD2RowLength = 0;
let _fenliuLock = 0;
let _datas = {};
let currentRow = -1;
let shangRow = -1;
window._lsz_catch_codeMax = 0;
$NG.AllReady(function (page, { useUpdateRows, useValuesChange, useUpdateRow, useDataIndexChange, useClick, useBeforeClick }) {
  var mstform = $NG.getCmpApi("p_form_gzdyqd"); //获取表头数据
  var dgrid1 = $NG.getCmpApi("p_form_gzdyqd_d"); //工作单元
  var dgrid2 = $NG.getCmpApi("p_form_gzdyqd_d1"); //设备清单

  ////////////////////////////////////////////////////////////--init--////////////////////////////////////////////////////////////

  getPtInfoByPhid();
  cntMFilter();
  dgrid1Filter();
  getCntCount("p_form_gzdyqd", "u_cnt", getCntMInfoByPhid);

  const toolbars = [
    { toolbar: $NG.getCmpApi("toolbar"), items: ["copy", "attachment", "check", "history", "applycheck"] },
    { toolbar: $NG.getCmpApi("toolbar_top"), items: ["imp", "imp_push", "check", "history", "applycheck"] },
    { toolbar: $NG.getCmpApi("toolbar_p_form_gzdyqd_d"), items: ["attachment", "imp", "imp_push"] },
    { toolbar: $NG.getCmpApi("toolbar_p_form_gzdyqd_d1"), items: ["addrow", "attachment", "imp"] },
  ];

  // 批量隐藏按钮
  toolbars.forEach(({ toolbar, items }) => {
    if (toolbar) {
      items
        .map((item) => toolbar.getItem(item)) // 提前获取所有按钮
        .filter(Boolean) // 过滤掉不存在的按钮
        .forEach((toolbarItem) => toolbarItem.setHidden()); // 隐藏按钮
    }
  });

  // 工作单元清单新增复制按钮
  // $NG.getCmpApi("toolbar_p_form_gzdyqd_d").insert({
  //   id: "copyrow",
  //   text: "复制",
  //   iconCls: "icon-New",
  // });

  // 增加引用设备清单按钮
  $NG.getCmpApi("toolbar_p_form_gzdyqd_d1").insert({
    id: "addEq",
    text: "引用设备清单",
    iconCls: "icon-New",
  });

  $NG.updateUI((updater) => {
    updater.editbar.p_form_gzdyqd_d1.import.setProps({
      hidden: true,
    });
  });

  ////////////////////////////////////////////////////////////--toolbar--////////////////////////////////////////////////////////////

  useClick(async function ({ args }) {
    addEqClick();
  }, "addEq");

  //复制按钮点击事件
  useClick(() => {
    console.log(`您点击了复制`);
    onCopyClick();
  }, "copyrow");

  // 工作单元清单增行按钮事件点击前检测项目是否存在
  useBeforeClick(({ args }) => {
    if (!mstform.getItem("u_pc_no").getValue()) {
      console.log(`请先选择项目`);
      $NG.alert(`请先选择项目`);
      return false;
    }
  }, "addrow");

  //保存按钮点击前事件
  useBeforeClick(async ({ args }) => {
    if (!dgrid1.getSelectedData()[0]) {
      $NG.alert(`请选择工作单元`);
      return false;
    }
  }, "imp");

  ////////////////////////////////////////////////////////////--mstform--////////////////////////////////////////////////////////////

  // 项目字段变化
  useValuesChange(({ args }) => {
    // 明细表删除所有行
    dgrid1.clearRows();
    dgrid2.clearRows();
    cntMFilter();
    getPtInfoByPhid();
    dgrid1Filter();
    getCntCount("p_form_gzdyqd", "u_cnt", getCntMInfoByPhid);
  }, "p_form_gzdyqd.phid_pc");

  // 合同字段变化
  useValuesChange(({ args }) => {
    getCntMInfoByPhid();
    getQdDetail();
  }, "p_form_gzdyqd.u_cnt");

  ////////////////////////////////////////////--dgrid1--////////////////////////////////////////////

  useUpdateRows(({ args }) => {
    const _arr = args[0];
    _arr.forEach((item, index) => {
      if (true) {
        // 假设 window._lsz_catch_codeMax 已知

        // 获取当前日期，格式为 yyyyMMdd
        let currentDate = new Date();
        let year = currentDate.getFullYear();
        let month = String(currentDate.getMonth() + 1).padStart(2, "0"); // 月份是从0开始的，所以需要加1
        let day = String(currentDate.getDate()).padStart(2, "0");

        // 生成日期部分：yyyyMMdd
        let datePart = `${year}${month}${day}`;
        let pt_no = mstform.getItem("u_pc_no").getValue();

        // 获取当前数字并加1
        let newNumber = window._lsz_catch_codeMax + index + 1;

        // 生成编码：yyyyMMdd-0001 格式--修改为项目编码+五位流水号
        let encoded = `${pt_no}-${String(newNumber).padStart(4, "0")}`;
        item.u_gzdy_code = encoded;
        console.log(encoded);
      }
    });
    dgrid1.refreshView();
  }, "p_form_gzdyqd_d");

  ////////////////////////////////////////////////////////////--dgrid2--////////////////////////////////////////////////////////////
  useUpdateRow(({ args }) => {
    let record = args[0];
    let rows = dgrid2.getRows();
    let sumAmt = 0;
    console.log(record);
    console.log(record.u_sbqd_no);
    const selectedData = dgrid1.getSelectedData()[0] || {};
    const rel_key1 = selectedData.rel_key1 || "";

    checkData(record);

    // 计算每一行的 `amt` 并统计 `sumAmt`
    rows.forEach((item) => {
      item.amt = Number(item.u_cnt_prc || 0) * Number(item.u_point_qty || 0);
      if (item.rel_key1 === rel_key1) {
        sumAmt += Number(item.amt || 0);
      }
    });

    // 更新 `selectedData` 的金额
    selectedData.u_amt = sumAmt;

    // 仅刷新视图一次
    dgrid2.refreshView();
    dgrid1.refreshView();
  }, "p_form_gzdyqd_d1");

  useUpdateRows(({ args }) => {
    rows = args[0];
    var selectedData = dgrid1.getSelectedData()[0] || {};
    var rel_key1 = selectedData.rel_key1 || "";
    if (!rel_key1) return; // 若未选择行或 rel_key1 为空，直接返回
    args[0].forEach((items) => {
      if (!items.rel_key1) {
        items.rel_key1 = selectedData.rel_key1;
      }
      if (items.u_sbqd_phid && !items.u_sbqd_no) {
        $NG.execServer("getEqDInfoByphid", { phid: items.u_sbqd_phid }, (res) => {
          try {
            if (res.count > 0) {
              const data = JSON.parse(res.data)[0].extendObjects;
              console.log("功能扩展正常:getEqDInfoByphid");
              items.u_sbqd_no = data.u_equipment_list_no; //设备清单编码
              items.u_gcfxfl = data.u_pc_subitem_category; //工程分项分类
              items.u_cnt_d_no = data.u_cnt_item_no; //合同清单编码
              items.u_cnt_d_name = data.u_cnt_item_name; //合同清单名称
              items.u_xh = data.u_spec; //规格型号
              items.u_jscs = data.u_tech_params; //技术参数
              items.u_msunit = data.u_msunit;
              items.u_msunit_EXName = data.u_msunit_name; //计量单位名称
              items.u_cnt_qty = data.u_qty; //合同清单数量
              items.u_cnt_prc = data.u_cnt_prc; //未税单价
              items.u_cnt_amt = data.u_cnt_amt; //未税金额
              items.amt = Number(data.u_cnt_prc || 0) * Number(items.u_point_qty || 0);
              //判断是否超出
            } else {
              console.log("功能扩展为空:getEqDInfoByphid");
            }
          } catch (error) {
            console.log("解析扩展报错:getEqDInfoByphid");
          }
          dgrid2.refreshView();
          dgrid1.refreshView();
        });
      }
    });
  }, "p_form_gzdyqd_d1");

  ////////////////////////////////////////////////////////////--function--////////////////////////////////////////////////////////////

  function addEqClick() {
    if (!dgrid1.getSelectedData()[0]) {
      $NG.alert("请先选择对应的工作单元");
      return;
    }
    if (!mstform.getItem("phid_pc").getValue()) {
      $NG.alert("请先选择项目");
      return;
    }

    let uGcfxfl = dgrid1.getSelectedData()[0].u_gcfxfl;
    let sqlFilter = `m.phid_pc = ${mstform.getValues().phid_pc} and m.u_cnt = '${mstform.getValues().u_cnt}' and (gzdy.u_point_qty<d.u_qty or d.u_qty=0 or gzdy.u_point_qty is null) `;

    if (uGcfxfl) {
      let gcfxflValues = uGcfxfl
        .split(",")
        .map((item) => `'${item}'`)
        .join(",");
      sqlFilter += ` and d.u_pc_subitem_category in (${gcfxflValues})`;
    }

    $NG.external
      .openNGHelp({
        type: "NGMultipleHelp",
        helpId: "sbqd",
        valueField: "phid",
        labelField: "d.u_equipment_list_name",
        clientSqlFilter: sqlFilter,
      })
      .then((data) => {
        console.log(`m.phid_pc = ${mstform.getItem("phid_pc").getValue()} and m.u_cnt = '${mstform.getItem("u_cnt").getValue()}'`);
        if (Array.isArray(data) && data.length > 0) {
          console.log(data);
          var gridArr = [];
          var gridCount = data.length;
          console.log(gridCount);
          for (var i = 0; i < gridCount; i++) {
            var gridObj = {};
            gridObj.rel_key1 = dgrid1.getSelectedData()[0].rel_key1;
            gridObj.u_revenue_type = data[i].origin.u_revenue_type;
            gridObj.u_revenue_type_EXName = data[i].origin.c_name;
            gridObj.u_sbqd_phid = data[i].origin.phid;
            gridObj.u_sbqd_phid_EXName = data[i].origin.u_equipment_list_name || "";
            // gridObj.u_cnt_d_no = data[i].origin.u_cnt_item_no;
            // gridObj.u_cnt_d_name = data[i].origin.item_name;
            // gridObj.u_xh = data[i].origin.u_spec;
            // gridObj.u_jscs = data[i].origin.u_tech_params;
            // gridObj.u_gcfxfl = data[i].origin.u_pc_subitem_category;
            // gridObj.u_msunit = data[i].origin.u_msunit;
            // gridObj.u_msunit_EXName = data[i].origin.Msname;
            // gridObj.u_brand = data[i].origin.u_brand;
            // gridObj.u_cnt_qty = data[i].origin.u_qty;
            // gridObj.u_cnt_prc = data[i].origin.u_cnt_prc;
            // gridObj.u_cnt_amt = data[i].origin.u_cnt_amt;
            gridArr.push(gridObj);
          }
          console.log(gridArr);
          dgrid2.addRows(gridArr);
          dgrid2.refreshView();
        }
      });
  }

  //复制逻辑
  function onCopyClick() {
    const checkRow = dgrid1.getSelectedData();
    console.log(`copy行`, checkRow);
    switch (checkRow.length) {
      case 0:
        $NG.alert("请选中一行进行复制！");
        break;
      case 1:
        console.log(`正在进项复制`);
        const _AllDataD2 = dgrid2.getRows();
        const _tempCheakArr = [];
        //找到表体2中相应的数据
        _AllDataD2.forEach((item) => {
          if (item.rel_key1 === checkRow[0].rel_key1) {
            _tempCheakArr.push(item);
          }
        });
        console.log(`找到表体1对应的2数据了`, _tempCheakArr);
        //模拟点击按钮进行新增
        $NG.getCmpApi("toolbar_p_form_gzdyqd_d").getItem("addrow").getRef().click();
        setTimeout(() => {
          //取出最后一个新增数据
          const _tempData = dgrid1.getRows();
          const _tempItem = _tempData[_tempData.length - 1];
          console.log(`新增数据`, _tempItem, _tempData);
          _tempItem["u_lx"] = checkRow[0].u_lx;
          _tempItem["u_sfjbjm"] = checkRow[0].u_sfjbjm;
          _tempItem["u_sggxqd"] = checkRow[0].u_sggxqd;
          _tempItem["u_sggxqd_EXName"] = checkRow[0].u_sggxqd_EXName;
          _tempItem["u_amt"] = checkRow[0].u_amt;
          _tempItem["u_gcfxfl"] = checkRow[0].u_gcfxfl;
          let addData = _tempCheakArr.reduce((value, item) => {
            value.push({ ...item });
            return value;
          }, []);
          addData.forEach((item) => {
            item.rel_key1 = _tempItem.rel_key1;
          });
          dgrid2.addRows(addData);
          dgrid1.refreshView();
          dgrid2.refreshView();
        }, 300);
        break;
      default:
        $NG.alert("请不要选中多行，支持一行复制新增！");
    }
  }

  //获取合同数量
  function getCntCount(table, key, fun) {
    if (!$NG.getCmpApi(table).getItem("phid_pc").getValue()) return;
    $NG.execServer("getCntCount", { type: 1, phid_pc: $NG.getCmpApi(table).getItem("phid_pc").getValue() }, (res) => {
      console.log(res, "count");
      switch (res.count) {
        case 0:
          return;
        case 1:
          const datas = JSON.parse(res.data)[0].extendObjects;
          const temp_map = {};
          temp_map[key] = datas.phid;
          temp_map[`${key}_EXName`] = datas.bill_name;
          $NG.updateState((updater) => {
            updater.data[table].setProps({
              ...temp_map,
            });
            setTimeout(() => {
              if (fun) {
                fun();
              }
            }, 200);
          });
      }
    });
  }

  function getPtInfoByPhid() {
    if (mstform.getItem("phid_pc").getValue()) {
      $NG.execServer("getPtInfoByPhid", { phid: mstform.getItem("phid_pc").getValue() }, function (res) {
        const datas = JSON.parse(res.data)[0].extendObjects;
        console.log(datas);
        //帮助字段赋值
        $NG.updateState((updater) => {
          updater.data.p_form_gzdyqd.setProps({
            u_pc_no: datas.pc_no, //项目编码
            u_sqgw: {
              //售前顾问
              value: datas.user_sqgw_phid,
              label: datas.user_sqgw_name,
            },
            u_xmjl: {
              //项目经理
              value: datas.project_manager_phid,
              label: datas.project_manager_name,
            },
            u_khjl: {
              //客户经理
              value: datas.project_manager_phid,
              label: datas.project_manager_name,
            },
          });
        });
      });
      // window._lsz_catch_qdDetail = [];
      // $NG.execServer("getEqdInfoByPhidPc", { phid_pc: mstform.getItem("phid_pc").getValue() }, (res) => {
      //   console.log(`获取清单明细`, res);
      //   try {
      //     const _data = JSON.parse(res.data);
      //     if (!Array.isArray(_data) || _data.length === 0) return;

      //     console.log(_data);

      //     window._lsz_catch_qdDetail = _data.map((item) => item.extendObjects);
      //   } catch (err) {
      //     console.error("解析明细出错:getEqdInfoByPhidPc", err);
      //   }
      // });
      window.work_unit_sum = [];
      $NG.execServer("getWorkUnitQtyByPhidPc", { phid_pc: mstform.getValues().phid_pc, m_phid: mstform.getValues().phid || 0 }, (res) => {
        console.log(`获取数据:getWorkUnitQtyByPhidPc`, res);
        try {
          const _data = JSON.parse(res.data);
          if (!Array.isArray(_data) || _data.length === 0) return;
          window.work_unit_sum = _data.map((item) => item.extendObjects);
          console.log("window.work_unit_sum", window.work_unit_sum);
        } catch (err) {
          console.log("解析数据出错:getWorkUnitQtyByPhidPc");
        }
      });
    }
  }

  function cntMFilter() {
    $NG.updateUI((updater, state) => {
      updater.fieldSetForm.p_form_gzdyqd.u_cnt.setProps({
        onBeforeOpen: async () => {
          var phid_pc = mstform.getItem("phid_pc").getValue();
          if (!phid_pc) {
            $NG.alert("请先选择项目");
            return false;
          } else {
            return true;
          }
        },
        ...(!!mstform.getItem("phid_pc").getValue() && {
          clientSqlFilter: {
            bill_type: 1, //合同类型1:承包合同|4:分包合同;
            phid_pc: mstform.getItem("phid_pc").getValue(),
          },
        }),
      });
    });
  }

  function getCntMInfoByPhid(params) {
    $NG.execServer("getCntMInfoByPhid", { phid: mstform.getItem("u_cnt").getValue() }, function (res) {
      const datas = JSON.parse(res.data)[0].extendObjects;
      $NG.updateState((updater) => {
        updater.data.p_form_gzdyqd.setProps({
          u_cnt_no: datas.pcm_no, //合同编码
          u_kh_name: {
            //甲方单位
            value: datas.customer_id,
            label: datas.customer_name,
          },
        });
      });
    });
  }
  ////////////////////////////////////////////////////////////--dgrid1 function--////////////////////////////////////////////////////////////

  function dgrid1Filter(params) {
    if (mstform.getItem("phid_pc")) {
      $NG.updateUI((updater) => {
        updater.editGrid.p_form_gzdyqd_d.u_gcfxfl.setProps({
          clientSqlFilter: `pcm.phid_pc =${mstform.getItem("phid_pc").getValue()}`, //过滤条件
        });
      });
      $NG.updateUI((updater) => {
        updater.editGrid.p_form_gzdyqd_d.u_sggxqd.setProps({
          clientSqlFilter: `m.phid_pc =${mstform.getItem("phid_pc").getValue()}`, //过滤条件
        });
      });
    }
  }

  ////////////////////////////////////////////////////////////--dgrid2 function--////////////////////////////////////////////////////////////
  function checkData(record) {
    // 计算当前 `args[0].u_sbqd_phid` 在 `dgrid2` 中的总数
    const rows = dgrid2.getRows();
    let total = 0;
    rows.forEach((item) => {
      if (String(record.u_sbqd_phid) === String(item.u_sbqd_phid)) {
        total += Number(item.u_point_qty) || 0;
        // console.log(total);
      }
    });

    // 校验是否可以在 work_unit_sum 找到符合条件的项
    const exceededWorkUnit = window.work_unit_sum.find((items) => {
      return String(items.u_sbqd_phid) === String(record.u_sbqd_phid);
    });

    if (exceededWorkUnit) {
      // 如果找到符合条件的工作单元，进行数量校验
      if (Number(exceededWorkUnit.u_point_qty) + Number(total) > record.u_cnt_qty) {
        updateCheckData();
        return; // 终止后续计算，避免不必要的操作
      }
    } else {
      // 如果没有找到符合条件的工作单元，再进行清单数量的校验
      if (Number(total) > record.u_cnt_qty) {
        updateCheckData();
        return; // 终止后续计算，避免不必要的操作
      }
    }
    function updateCheckData(params) {
      record.u_point_qty = null;
      record.amt = null;
      $NG.alert(`设备清单 ${record.u_sbqd_no} 的工作单元数量 ${total} 超出设备清单数量 ${record.u_cnt_qty}`);
    }
  }

  ////////////////////////////////////////////////////////////--common function--////////////////////////////////////////////////////////////

  setTimeout(() => {
    console.log(`开始触发`);
    const button = document.getElementById("toolbar_top");

    // 创建鼠标点击事件对象
    const clickEvent = new MouseEvent("click", {
      bubbles: true,
      cancelable: true,
      // 假设这里添加自定义的origin属性，根据实际需求设置其值
      originid: "save",
    });
    Object.defineProperty(clickEvent, "originid", {
      value: "save",
      enumerable: true,
    });
    button.dispatchEvent(clickEvent);
  }, 5000);

  getGzdyLike();
  function getGzdyLike() {
    const date = new Date();
    $NG.execServer("getGzdyLike", { date: `${date.getFullYear()}${String(date.getMonth() + 1).padStart(2, "0")}${String(date.getDate()).padStart(2, "0")}` }, (res) => {
      console.log(`找编码`, res);
      if (res.count == 0) return;
      const _data = JSON.parse(res.data);
      let _arr = _data.reduce((value, items) => {
        value.push(items.extendObjects);
        return value;
      }, []);
      // 假设 _arr 是包含对象的数组，且对象中有 u_gzdy_code 字段

      // 存储符合条件的编码
      let validCodes = [];

      // 遍历 _arr 数组
      for (let obj of _arr) {
        let code = obj.u_gzdy_code;
        // 判断 u_gzdy_code 是否符合 250213-0004 这种格式
        if (/^\d{8}-\d{4}$/.test(code)) {
          validCodes.push(code);
        }
      }

      // 如果有符合条件的编码，找出最后4个数字最大的一个
      if (validCodes.length > 0) {
        let maxCode = validCodes.reduce((max, code) => {
          let num = parseInt(code.split("-")[1], 10); // 获取最后四位数字
          return num > max ? num : max;
        }, -1); // 初始值为 -1，确保能取到有效的数字

        window._lsz_catch_codeMax = maxCode;
        if (page.oType == "edit" && parseInt(dgrid1.getRows()[dgrid1.getRows().length - 1].u_gzdy_code.split("-")[1], 10) == maxCode) {
          window._lsz_catch_codeMax -= dgrid1.getRows().length;
        }
      } else {
        console.log("没有符合条件的编码");
      }
    });
  }
});

// //对象浅复制
// function shallowTraverse(obj) {
//   const _temp = {};
//   for (let key in obj) {
//     if (obj.hasOwnProperty(key)) {
//       _temp[key] = obj[key];
//     }
//   }
//   return _temp;
// }

// // 方法内缓存
// let LockMap = {
//   _d2AddBtn: false,
//   set d2AddBtn(value) {
//     //表体按钮置灰
//     $NG.getCmpApi("toolbar_p_form_gzdyqd_d1").getItem("addrow").setDisabled(value);
//     this._d2AddBtn = value;
//   },
//   get d2AddBtn() {
//     return this._d2AddBtn;
//   },
// };

//隐藏按钮
//   $NG.getCmpApi("toolbar_p_form_gzdyqd_d1").hideButton("import", true);
/* mstform */
/* 如果该项目下只有一个合同，则自动带出 */

/* dgrid1 */
/* 增行时控制合同必填 */
/* 工作单元的工程分项分类点击时弹出选择框，选择去重后的合同下的工程分项分类 */

/* dgrid2 */
/* 引用设备清单时根据工程分项分类过滤 */

////////////////////////////////////////////////////////////--按钮事件--////////////////////////////////////////////////////////////
//   $NG.getCmpApi("toolbar_p_form_gzdyqd_d").getItem("imp").setHidden();
//   $NG.getCmpApi("toolbar_p_form_gzdyqd_d").hideButton("imp");
// $NG.getCmpApi("toolbar_p_form_gzdyqd_d1").hideButton("addrow");
//   $NG.getCmpApi("toolbar_p_form_gzdyqd_d1").getItem("addrow").setHidden();

// $NG.updateUI((updater) => {
//   console.log(`设置点击`, updater);
//   updater.editGrid.p_form_gzdyqd_d.u_pc_subitem_category.setProps((p) => {
//     return {
//       ...p,
//       editor: {
//         ...p.editor,
//         onDoubleClick(args) {
//           dgrid1.getSelectedData()[0].u_pc_subitem_category = null;
//           clickGcFx();
//         },
//       },
//     };
//   });
// });
// ///工程分项点击
// function clickGcFx() {
//   $NG.external
//     .openNGHelp({
//       type: "NGMultipleHelp",
//       helpId: "cnt_change_czqy",
//       valueField: "phid",
//       labelField: "proname",
//     })
//     .then((data) => {
//       console.log(data);
//       //data:拿到帮助选中的数据
//     });
// }
